home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 June
/
EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso
/
earcd
/
cmdity
/
yk212src.lha
/
Yak_2.12_Src
/
Prefs
/
Keydef.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-11-16
|
8KB
|
345 lines
#include <exec/types.h>
#include <libraries/commodities.h>
#include <proto/keymap.h>
#include <string.h>
#include "code.h"
#include "yak.h"
#include "handlers.h"
#include "gui.h"
#include "keydef.h"
#include "Keydef_window.h"
UBYTE ParentWindowID; /* Identifier of the parent window to switch back */
#define QUALIFIERS_NUMBER 13
static const struct QualifierArrayType QualifierArray[] =
{
{IEQUALIFIER_CONTROL, "Control"},
{IEQUALIFIER_LSHIFT, "LShift"},
{IEQUALIFIER_RSHIFT, "RShift"},
{IEQUALIFIER_CAPSLOCK, "CapsLock"},
{IEQUALIFIER_LALT, "LAlt"},
{IEQUALIFIER_RALT, "RAlt"},
{IEQUALIFIER_LCOMMAND, "LCommand"},
{IEQUALIFIER_RCOMMAND, "RCommand"},
{IEQUALIFIER_LEFTBUTTON, "LeftButton"},
{IEQUALIFIER_MIDBUTTON, "MidButton"},
{IEQUALIFIER_RBUTTON, "RButton"},
{IEQUALIFIER_REPEAT, "Repeat"},
{IEQUALIFIER_NUMERICPAD, "NumericPad"}
};
#define SAMEQUALIFIERS_NUMBER 3
static const struct QualifierArrayType SameQualifierArray[] =
{
{IXSYM_SHIFTMASK, "Shift"},
{IXSYM_CAPSMASK, "Caps"},
{IXSYM_ALTMASK, "Alt"}
};
#define QUALIFIERSPAD_NUMBER 9
static const struct QualifierPadArrayType QualifierPadArray[] =
{
{0x60, IEQUALIFIER_LSHIFT},
{0x61, IEQUALIFIER_RSHIFT},
{0x62, IEQUALIFIER_CAPSLOCK}, /* CapsLock down */
{0xe2, IEQUALIFIER_CAPSLOCK}, /* CapsLock up */
{0x63, IEQUALIFIER_CONTROL},
{0x64, IEQUALIFIER_LALT},
{0x65, IEQUALIFIER_RALT},
{0x66, IEQUALIFIER_LCOMMAND},
{0x67, IEQUALIFIER_RCOMMAND}
};
#define CODES_NUMBER 31
static const struct CodeArrayType CodeArray[] =
{
{0x38, "Comma"},
{0x40, "Space"},
{0x41, "BackSpace"},
{0x42, "Tab"},
{0x43, "Enter"},
{0x44, "Return"},
{0x45, "Esc"},
{0x46, "Del"},
{0x47, "Insert"},
{0x48, "Page_Up"},
{0x49, "Page_Down"},
{0x4C, "Up"},
{0x4D, "Down"},
{0x4E, "Right"},
{0x4F, "Left"},
{0x50, "F1"},
{0x51, "F2"},
{0x52, "F3"},
{0x53, "F4"},
{0x54, "F5"},
{0x55, "F6"},
{0x56, "F7"},
{0x57, "F8"},
{0x58, "F9"},
{0x59, "F10"},
{0x5F, "Help"},
{0x68, "Mouse_LeftPress"},
{0x69, "Mouse_RightPress"},
{0x6A, "Mouse_MiddlePress"},
{0x70, "Home"},
{0x71, "End"}
};
const STRPTR ClassArray[] =
{
"RawKey",
"RawMouse",
"DiskInserted",
"DiskRemoved"
};
const STRPTR StrokeArray[] =
{
"",
" upstroke",
" -upstroke"
};
static __regargs void
ConvertQualifiers(UWORD qual, UWORD iqual, UWORD squal, char *qualstr)
{
UWORD i;
*qualstr = '\0';
for (i=0; i<SAMEQUALIFIERS_NUMBER; i++)
{
if ((qual & squal & SameQualifierArray[i].qat_ID) == SameQualifierArray[i].qat_ID)
{
*qualstr++ = ' ';
qualstr = stpcpy(qualstr, SameQualifierArray[i].qat_Str);
}
if ((iqual & squal & SameQualifierArray[i].qat_ID) == SameQualifierArray[i].qat_ID)
{
*qualstr++ = ' ';
*qualstr++ = '-';
qualstr = stpcpy(qualstr, SameQualifierArray[i].qat_Str);
}
}
qual &= ~squal;
iqual &= ~squal;
for (i=0; i<QUALIFIERS_NUMBER; i++)
{
if (qual & QualifierArray[i].qat_ID)
{
*qualstr++ = ' ';
qualstr = stpcpy(qualstr, QualifierArray[i].qat_Str);
}
if (iqual & QualifierArray[i].qat_ID)
{
*qualstr++ = ' ';
*qualstr++ = '-';
qualstr = stpcpy(qualstr, QualifierArray[i].qat_Str);
}
}
}
static __regargs BOOL
ConvertCode(UWORD code, char *codestr)
{
*codestr = '\0';
if (code != NO_IECODE)
{
struct InputEvent ievent;
UWORD i;
for (i=0; i<CODES_NUMBER; i++)
{
if (code == CodeArray[i].cat_Code)
{
codestr[0] = ' ';
strcpy(codestr+1, CodeArray[i].cat_Str);
return TRUE;
}
}
ievent.ie_Class = IECLASS_RAWKEY;
ievent.ie_Code = code;
ievent.ie_Qualifier = NO_IEQUALIFIER;
ievent.ie_Prev1DownCode = ievent.ie_Prev1DownQual = NO_IEQUALIFIER;
ievent.ie_Prev2DownCode = ievent.ie_Prev2DownQual = NO_IEQUALIFIER;
if((MapRawKey(&ievent, codestr+1, 1, NULL) == 1) &&
(codestr[1] != '-')) /* forbidden */
{
codestr[0] = ' ';
codestr[2] = '\0';
return TRUE;
}
}
return FALSE;
}
__regargs BOOL
BuildKeyDef(YakKeyDef *ykd, STRPTR desc)
{
BOOL ret;
UBYTE codestr[20], qualstr[110];
ConvertQualifiers(ykd->ykd_Qual, ykd->ykd_IQual, ykd->ykd_SQual, qualstr);
switch (ykd->ykd_Class)
{
case HKCLASS_RAWKEY:
case HKCLASS_RAWMOUSE:
ret = ConvertCode(ykd->ykd_Code, codestr);
break;
case HKCLASS_DISKINSERTED:
case HKCLASS_DISKREMOVED:
codestr[0]='\0';
ret = TRUE;
break;
}
stpcpy(desc, ClassArray[ykd->ykd_Class]);
strcat(desc, qualstr);
strcat(desc, StrokeArray[ykd->ykd_Stroke]);
strcat(desc, codestr);
return ret;
}
__regargs LONG
ParseKeyDef(STRPTR desc, YakKeyDef *ykd)
{
IX ix;
LONG ret;
if (!(ret=CompatibleParseIX(desc, &ix)))
{
/* Class ? */
if (ParentWindowID != MCYCLING_WINDOW)
{
switch(ix.ix_Class)
{
case IECLASS_RAWKEY:
ykd->ykd_Class = HKCLASS_RAWKEY;
break;
case IECLASS_RAWMOUSE:
ykd->ykd_Class = HKCLASS_RAWMOUSE;
break;
case IECLASS_DISKINSERTED:
ykd->ykd_Class = HKCLASS_DISKINSERTED;
break;
case IECLASS_DISKREMOVED:
ykd->ykd_Class = HKCLASS_DISKREMOVED;
break;
default:
return -1;
}
}
else
{
if (ix.ix_Class == IECLASS_RAWMOUSE)
ykd->ykd_Class = HKCLASS_RAWMOUSE;
else
return -1;
}
/* Qualifier ? */
ykd->ykd_Qual = ix.ix_Qualifier;
ykd->ykd_IQual = ~ix.ix_QualMask;
ykd->ykd_SQual = NO_IEQUALIFIER;
if (ix.ix_QualSame & IXSYM_SHIFT) ykd->ykd_SQual |= IXSYM_SHIFTMASK;
if (ix.ix_QualSame & IXSYM_CAPS) ykd->ykd_SQual |= IXSYM_CAPSMASK;
if (ix.ix_QualSame & IXSYM_ALT) ykd->ykd_SQual |= IXSYM_ALTMASK;
/* Stroke ? */
if (ix.ix_Code & IECODE_UP_PREFIX)
{
ykd->ykd_Stroke = HKSTROKE_UP;
}
else
{
if (~ix.ix_CodeMask & IECODE_UP_PREFIX)
{
ykd->ykd_Stroke = HKSTROKE_DOWN_UP;
}
else
{
ykd->ykd_Stroke = HKSTROKE_DOWN;
}
}
/* Code ? */
if (!ix.ix_Code && (ix.ix_Class == IECLASS_RAWMOUSE))
{
ykd->ykd_Code = NO_IECODE;
}
else
{
ykd->ykd_Code = ix.ix_Code & ~IECODE_UP_PREFIX;
}
}
else
{
if (ret == -2) /* NULL description */
{
if (ParentWindowID == MCYCLING_WINDOW)
{
ykd->ykd_Class = HKCLASS_RAWMOUSE;
ykd->ykd_Qual = ykd->ykd_IQual = ykd->ykd_SQual = NO_IEQUALIFIER;
ykd->ykd_Stroke = HKSTROKE_DOWN;
ykd->ykd_Code = NO_IECODE;
}
else
{
ykd->ykd_Class = HKCLASS_RAWKEY;
ykd->ykd_Qual = ykd->ykd_IQual = ykd->ykd_SQual = NO_IEQUALIFIER;
ykd->ykd_Stroke = HKSTROKE_DOWN;
ykd->ykd_Code = NO_IECODE;
}
}
}
return ret;
}
__regargs UWORD
IsQualifierPad(UWORD code)
{
UWORD i;
for (i=0; i<QUALIFIERSPAD_NUMBER; i++)
if (QualifierPadArray[i].qpat_Code == code)
return QualifierPadArray[i].qpat_Qualifier;
return NO_IEQUALIFIER;
}